package cluedo.gui;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JButton;


/**
 * La classe che rappresenta e gestisce il dado
 */

public class Dice extends JButton {

	private static final long serialVersionUID = -4556877958175284727L;

	/** diametro puntini */
	private static final int SPOT_DIAM = 6;  
    
	/** valore mostrato sulla faccia del dado */
    private int faceValue; 
    
    /**
     * il lato del quadrato che forma il dado
     */
    private int DIM = 60;
  
    public Dice() {
    	
        setPreferredSize(new Dimension(DIM,DIM));
        roll();  // Imposta la faccia ad un numero iniziale casuale
    }
    
    
    @Override
    public Dimension getPreferredSize(){
    	return new Dimension(DIM,DIM);
    }
    
    /** 
     * Simula il lancio del dado
     * @return valore tra 1 e 6
     */
    public int roll() {
    	int val= Math.round((float)Math.random()*5+1); //ottieni un numero casuale tra 1 e 6  // Range 1-6
        setValue(val);
        return val;
    }
    
    /**
     * Restituisce il valore mostrato sul dado
     * @return il valore del dado
     */
    public int getValue() {
        return faceValue;
    }
    
    /** 
     * Imposta il valore da visualizzare nel dado
     * @param spots numero da 1 a 6
     */
    public void setValue(int spots) {
        faceValue = spots;
        repaint();    // Value e' cambiato, necessario repaint
    }
    
    /** Disegna il dado e i pallini su di esso */
    @Override public void paintComponent(Graphics g) {
        int w = getWidth(); 
        int h = getHeight();
        
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        
        //background del dado
        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, w, h);
        g2.setColor(Color.BLACK);
        
        float thickness = 5; //bordo dado
        g2.setStroke(new BasicStroke(thickness));
        
        g2.drawRect(0, 0, w-1, h-1);  // Disegna bordo del dado
        
        switch (faceValue) {
            case 1:
                drawSpot(g2, w/2, h/2);
                break;
            case 3:
                drawSpot(g2, w/2, h/2);
                //rientra anche nel case 2
            case 2:
                drawSpot(g2, w/4, h/4);
                drawSpot(g2, 3*w/4, 3*h/4);
                break;
            case 5:
                drawSpot(g2, w/2, h/2);
                // rientra anche nel case 4
            case 4:
                drawSpot(g2, w/4, h/4);
                drawSpot(g2, 3*w/4, 3*h/4);
                drawSpot(g2, 3*w/4, h/4);
                drawSpot(g2, w/4, 3*h/4);
                break;
            case 6:
                drawSpot(g2, w/4, h/4);
                drawSpot(g2, 3*w/4, 3*h/4);
                drawSpot(g2, 3*w/4, h/4);
                drawSpot(g2, w/4, 3*h/4);
                drawSpot(g2, w/4, h/2);
                drawSpot(g2, 3*w/4, h/2);
                break;
        }
    }
    
    /** Disegna singolo pallino dado */
    private void drawSpot(Graphics2D g2, int x, int y) {
        g2.fillOval(x-SPOT_DIAM/2, y-SPOT_DIAM/2, SPOT_DIAM, SPOT_DIAM);
    }
}
